今天要來透過 Python 內建的 ssl 模組來進行簡單的 SSL/TLS 實作,學習 HTTPS 加密通訊,並了解 SSL/TLS 在保護網路通信中的具體應用。
接下來我將使用 Python 內建的 ssl
模組建立一個簡單的 HTTPS 伺服器與客戶端,並進行加密通訊。
步驟 1:建立一個簡單的 HTTPS 伺服器
我使用 Python 提供的 http.server
模組來建立一個基礎的 HTTP 伺服器,並透過 ssl
模組將其升級為 HTTPS,這樣可以在本地建立一個加密的通訊通道。
import http.server
import ssl
import socketserver
# 定義一個簡單的請求處理器
class SimpleHTTPRequestHandler(http.server.SimpleHTTPRequestHandler):
def do_GET(self):
self.send_response(200)
self.end_headers()
self.wfile.write(b"Hello, this is an HTTPS connection!")
# 設置伺服器
httpd = socketserver.TCPServer(('localhost', 4443), SimpleHTTPRequestHandler)
# 包裝伺服器為 SSL,這裡不使用外部的憑證
httpd.socket = ssl.wrap_socket(httpd.socket, certfile=None, keyfile=None, server_side=True)
print("Serving on https://localhost:4443...")
httpd.serve_forever()
這段程式碼中,定義了一個簡單的 HTTP 請求處理器,並且將 HTTP 伺服器包裝為支持 SSL 的 HTTPS 伺服器,當在本地訪問 https://localhost:4443
,伺服器會回傳一個加密訊息。
步驟 2:建立一個簡單的 HTTPS 客戶端
接著建立一個與上述伺服器通訊的客戶端,同樣透過 Python 內建的 ssl
模組進行 SSL/TLS 加密。
import ssl
import socket
# 創建 SSL 上下文
context = ssl.create_default_context()
# 與伺服器進行加密連接
with socket.create_connection(('localhost', 4443)) as sock:
with context.wrap_socket(sock, server_hostname='localhost') as ssock:
print(f"SSL established. Peer: {ssock.getpeercert()}")
ssock.sendall(b"GET / HTTP/1.1\r\nHost: localhost\r\n\r\n")
data = ssock.recv(1024)
print(data.decode())
這段程式碼顯示如何建立一個簡單的客戶端,與伺服器進行加密連接並接收伺服器回傳的數據。
以上方法較適合用於學習與測試,如果要實際使用的話,要使用經過認證的 SSL 憑證,或使用更高版本的 TLS 協議。